#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "../ourhdr.h"

static void lockabyte(const char *, int, off_t);

/***
 * 死锁检测
 **/
int main(void)
{
    int fd;
    pid_t pid;
    if((fd= creat("templock", FILE_MODE))<0)
    {
        err_sys("create error");
    }
    if(write(fd, "ab", 2)!=2)
    {
        err_sys("write error");
    }
    TELL_WAIT();
    if((pid =fork())< 0)
    {
        err_sys("fork error");
    }
    else if(pid == 0)
    {
        lockabyte("child",fd, 0);
        TELL_PARENT(getppid());
        WAIT_PARENT();
        lockabyte("child",fd, 1);
    }
    else
    {
        lockabyte("parent", fd, 1);
        TELL_CHILD(pid);
        WAIT_CHILD();
        lockabyte("parent", fd, 0);
    }
    exit(0);
}

static void lockabyte(const char *name, int fd, off_t offset)
{
    if(writew_lock(fd, offset, SEEK_SET, 1)< 0)
    {
        err_sys("%s writw_lock error", name);
    }
    printf("%s: got hte lock, byte %lld\n", name, offset);
}